#include "apue.h"
#include <errno.h>

void make_temp(char *template);

/*
    两种模板字符声明方式不同
        1. 使用数组，名字在栈上分配
        2. 使用指针，只有指针自身留在栈上
    编译器把字符串放在可执行文件的只读段，
    mkstemp函数试图修改字符串时，出现段错误
 */

int main() {
    char good_template[] = "/tmp/dirXXXXXX"; // right way
    char *bad_template = "/tmp/dirXXXXXX"; // bad way, XXXXXX字符串会被原地替换，常量区字符串无法修改，否则造成段错误
    printf("trying to create first temp file...\n");
    make_temp(good_template);
    printf("trying to create second temp file...\n");
    make_temp(bad_template); // cause `segmentation fault'
    return 0;
}

void make_temp(char *template) {
    int fd;
    if ((fd = mkstemp(template)) < 0) {
        err_sys("can't create temp file");
    }
    printf("temp name = %s\n", template);
    close(fd);

    struct stat sbuf;
    if (stat(template, &sbuf) < 0) {
        if (errno == ENOENT) {
            printf("file doesn't exist\n");
        } else {
            err_sys("stat failed");
        }
    } else {
        printf("file exsist\n");
        unlink(template);
    }
}